From 376dc4d1691317957bd94a85dea1cf695713e619 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sat, 11 Aug 2018 17:42:19 +0200 Subject: [PATCH] shortcutcontroller: Add private API for running class shortcuts We don't want regular users to be able to run class shortcuts in their controllers, so we have to special case that. --- gtk/gtkshortcutcontroller.c | 33 +++++++++++++++++++++--------- gtk/gtkshortcutcontrollerprivate.h | 28 +++++++++++++++++++++++++ gtk/gtkwidget.c | 3 ++- 3 files changed, 53 insertions(+), 11 deletions(-) create mode 100644 gtk/gtkshortcutcontrollerprivate.h diff --git a/gtk/gtkshortcutcontroller.c b/gtk/gtkshortcutcontroller.c index 6d57bb7b7a..005c480033 100644 --- a/gtk/gtkshortcutcontroller.c +++ b/gtk/gtkshortcutcontroller.c @@ -29,7 +29,7 @@ #include "config.h" -#include "gtkshortcutcontroller.h" +#include "gtkshortcutcontrollerprivate.h" #include "gtkeventcontrollerprivate.h" #include "gtkbindings.h" @@ -41,6 +41,8 @@ struct _GtkShortcutController { GtkEventController parent_instance; + + guint run_class : 1; }; struct _GtkShortcutControllerClass @@ -82,17 +84,21 @@ gtk_shortcut_controller_handle_event (GtkEventController *controller, const GSList *l; widget = gtk_event_controller_get_widget (controller); - if (event_type == GDK_KEY_PRESS || - event_type == GDK_KEY_RELEASE) - { - if (gtk_bindings_activate_event (G_OBJECT (widget), event)) - return TRUE; - } - for (l = gtk_widget_class_get_shortcuts (GTK_WIDGET_GET_CLASS (widget)); l; l = l->next) + if (self->run_class) { - if (gtk_shortcut_controller_trigger_shortcut (self, l->data, event)) - return TRUE; + if (event_type == GDK_KEY_PRESS || + event_type == GDK_KEY_RELEASE) + { + if (gtk_bindings_activate_event (G_OBJECT (widget), event)) + return TRUE; + } + + for (l = gtk_widget_class_get_shortcuts (GTK_WIDGET_GET_CLASS (widget)); l; l = l->next) + { + if (gtk_shortcut_controller_trigger_shortcut (self, l->data, event)) + return TRUE; + } } return FALSE; @@ -119,3 +125,10 @@ gtk_shortcut_controller_new (void) return g_object_new (GTK_TYPE_SHORTCUT_CONTROLLER, NULL); } + +void +gtk_shortcut_controller_set_run_class (GtkShortcutController *controller, + gboolean run_class) +{ + controller->run_class = run_class; +} diff --git a/gtk/gtkshortcutcontrollerprivate.h b/gtk/gtkshortcutcontrollerprivate.h new file mode 100644 index 0000000000..945e526e66 --- /dev/null +++ b/gtk/gtkshortcutcontrollerprivate.h @@ -0,0 +1,28 @@ +/* + * Copyright © 2018 Benjamin Otte + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + * + * Authors: Benjamin Otte + */ + +#ifndef __GTK_SHORTCUT_CONTROLLER_PRIVATE_H__ +#define __GTK_SHORTCUT_CONTROLLER_PRIVATE_H__ + +#include "gtkshortcutcontroller.h" + +void gtk_shortcut_controller_set_run_class (GtkShortcutController *controller, + gboolean run_class); + +#endif /* __GTK_SHORTCUT_CONTROLLER_H__ */ diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c index 2eb7c486d2..5072e46c4e 100644 --- a/gtk/gtkwidget.c +++ b/gtk/gtkwidget.c @@ -59,7 +59,7 @@ #include "gtkscrollable.h" #include "gtksettingsprivate.h" #include "gtkshortcut.h" -#include "gtkshortcutcontroller.h" +#include "gtkshortcutcontrollerprivate.h" #include "gtkshortcuttrigger.h" #include "gtksizegroup-private.h" #include "gtksnapshotprivate.h" @@ -2412,6 +2412,7 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class) controller = gtk_shortcut_controller_new (); gtk_event_controller_set_name (controller, "gtk-widget-class-shortcuts"); + gtk_shortcut_controller_set_run_class (GTK_SHORTCUT_CONTROLLER (controller), TRUE); gtk_widget_add_controller (widget, controller); } -- 2.30.2